package com.cyt.web.controller.gen;

import com.cyt.base.model.dto.ReturnResult;
import com.cyt.gen.model.po.FormTool;
import com.cyt.gen.model.vo.FormFieldVo;
import com.cyt.gen.model.vo.FormTableFieldVo;
import com.cyt.gen.model.vo.FormTableVo;
import com.cyt.gen.service.FormFieldService;
import com.cyt.gen.service.FormTableService;
import com.cyt.gen.service.FormToolService;
import com.cyt.sys.util.SysContant;
import com.cyt.web.controller.sys.SysBaseController;
import org.apache.commons.lang3.StringUtils;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * 表单生成
 *
 * @author rong yuan
 * @date 2019/4/12 14:48
 */
@RestController
public class FormController extends SysBaseController {

    @Resource
    private FormTableService formTableService;
    @Resource
    private FormToolService formToolService;
    @Resource
    private FormFieldService formFieldService;

    /**
     * 统一跳转
     *
     * @param model 视图对象
     * @return Model
     * @author rong yuan
     * @date 2019/4/12 14:49
     */
    @RequestMapping("/gen/form/*")
    public Model goPage(Model model) {
        return model;
    }

    /**
     * 分页查询表信息
     *
     * @param formTableVo 传入参数对象
     * @param limit       页面数量
     * @param page        当前页面
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/12 15:04
     */
    @RequestMapping(value = "/gen/form/pageTable", method = RequestMethod.POST)
    public ReturnResult pageTable(FormTableVo formTableVo, int limit, int page) {
        return formTableService.pageTable(formTableVo, limit, page);
    }

    /**
     * list查询表信息
     *
     * @param formTableVo 传入参数对象
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/12 15:04
     */
    @RequestMapping(value = "/gen/form/listTable", method = RequestMethod.POST)
    public ReturnResult listTable(FormTableVo formTableVo) {
        return new ReturnResult(formTableService.listTable(formTableVo));
    }

    /**
     * 跳转实体配置界面
     *
     * @param formTableVo 传入参数对象
     * @return ModelAndView
     * @author rong yuan
     * @date 2019/4/12 16:15
     */
    @RequestMapping(value = "/gen/form/getFormTableEdit", method = RequestMethod.GET)
    public ModelAndView getTableByName(FormTableVo formTableVo) {
        ModelAndView view = new ModelAndView("/gen/form/formTableEdit");
        if (StringUtils.isNotBlank(formTableVo.getTableName())) {
            formTableVo = formTableService.selectTableByTableName(formTableVo);
            formTableVo.setFormTableFieldVoList(formTableService.listTableField(formTableVo));
        }
        view.addObject(formTableVo);
        return view;
    }

    /**
     * list查询表字段信息
     *
     * @param formTableVo 传入参数对象
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/12 15:04
     */
    @RequestMapping(value = "/gen/form/listTableField", method = RequestMethod.POST)
    public ReturnResult listTableField(FormTableVo formTableVo) {
        return new ReturnResult(formTableService.listTableField(formTableVo));
    }

    /**
     * 跳转选择字段界面
     *
     * @param formTableFieldVo 传入参数对象
     * @return ModelAndView
     * @author rong yuan
     * @date 2019/4/12 16:15
     */
    @RequestMapping(value = "/gen/form/getFieldSelector", method = RequestMethod.GET)
    public ModelAndView getFieldSelector(FormTableFieldVo formTableFieldVo) {
        ModelAndView view = new ModelAndView("/gen/form/fieldSelector");
        view.addObject("field", formTableFieldVo.getField());
        return view;
    }

    /**
     * 新建数据库表
     *
     * @param formTableVo 传入参数对象
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/15 10:39
     */
    @RequestMapping(value = "/gen/form/createTable", method = RequestMethod.POST)
    public ReturnResult createTable(FormTableVo formTableVo) {
        return formTableService.createTable(formTableVo);
    }

    /**
     * 跳转表格配置界面
     *
     * @param formTableVo 传入参数对象
     * @return ModelAndView
     * @author rong yuan
     * @date 2019/4/12 16:15
     */
    @RequestMapping(value = "/gen/form/getFormPageEdit", method = RequestMethod.GET)
    public ModelAndView getFormPageEdit(FormTableVo formTableVo, FormTool formTool, FormFieldVo formFieldVo) {
        ModelAndView view = new ModelAndView("/gen/form/formPageEdit");
        //数据库表信息
        view.addObject("formTableVo", formTableVo);
        //工具栏信息
        formTool = formToolService.selectOne(formTool);
        view.addObject("formTool", formTool);
        //搜索栏信息
        formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SEARCH);
        List<FormFieldVo> formSearchVoList = formFieldService.list(formFieldVo);
        if (formSearchVoList != null && formSearchVoList.size() > 0) {
            view.addObject("formSearchVoList", formSearchVoList);
        } else {
            view.addObject("formSearchVoList", initTableField(formTableVo, formSearchVoList));
        }
        //表格信息
        formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SHOW);
        List<FormFieldVo> formShowVoList = formFieldService.list(formFieldVo);
        if (formShowVoList != null && formShowVoList.size() > 0) {
            view.addObject("formShowVoList", formShowVoList);
        } else {
            view.addObject("formShowVoList", initTableField(formTableVo, formShowVoList));
        }
        return view;
    }

    /**
     * 跳转表单配置界面
     *
     * @param formTableVo 传入参数对象
     * @return ModelAndView
     * @author rong yuan
     * @date 2019/4/12 16:15
     */
    @RequestMapping(value = "/gen/form/getFormFieldEdit", method = RequestMethod.GET)
    public ModelAndView getFormFieldEdit(FormTableVo formTableVo, FormFieldVo formFieldVo) {
        ModelAndView view = new ModelAndView("/gen/form/formFieldEdit");
        //数据库表信息
        view.addObject("formTableVo", formTableVo);
        //表单信息
        formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_FIELD);
        List<FormFieldVo> formFieldVoList = formFieldService.list(formFieldVo);
        if (formFieldVoList != null && formFieldVoList.size() > 0) {
            view.addObject("formFieldVoList", formFieldVoList);
        } else {
            view.addObject("formFieldVoList", initTableField(formTableVo, formFieldVoList));
        }
        return view;
    }

    private List<FormFieldVo> initTableField(FormTableVo formTableVo, List<FormFieldVo> formFieldVoList) {
        List<FormTableFieldVo> formTableFieldVoList = formTableService.listTableField(formTableVo);
        if (formTableFieldVoList != null && formTableFieldVoList.size() > 0) {
            if (formFieldVoList == null) {
                formFieldVoList = new ArrayList<>();
            }
            for (FormTableFieldVo formTableFieldVo : formTableFieldVoList) {
                FormFieldVo formFieldVo = new FormFieldVo();
                formFieldVo.setField(formTableFieldVo.getField());
                formFieldVo.setName(formTableFieldVo.getComment());
                formFieldVoList.add(formFieldVo);
            }
            return formFieldVoList;
        } else {
            return null;
        }
    }

    /**
     * 保存表单设置
     *
     * @param request     请求对象
     * @param formTableVo 传入参数对象
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/16 16:46
     */
    @RequestMapping(value = "/gen/form/saveOrUpdate", method = RequestMethod.POST)
    public ReturnResult saveOrUpdate(HttpServletRequest request, FormTableVo formTableVo) {
        return formTableService.saveOrUpdate(formTableVo, acceptCurrentUser(request));
    }

    /**
     * 跳转表格预览界面
     *
     * @param formTableVo 传入参数对象
     * @return ModelAndView
     * @author rong yuan
     * @date 2019/4/12 16:15
     */
    @RequestMapping(value = "/gen/form/getFormPreviewList", method = RequestMethod.GET)
    public ModelAndView getFormPreviewList(FormTableVo formTableVo) {
        ModelAndView view = new ModelAndView("/gen/form/formPreviewList");
        //数据库表信息
        view.addObject("formTableVo", formTableVo);

        FormTableVo vo = formTableService.selectForPreviewList(formTableVo);
        //工具栏信息
        view.addObject("formTool", vo.getFormTool());
        //搜索栏信息
        view.addObject("formSearchVoList", vo.getFormSearchVoList());
        //展示字段信息
        view.addObject("formShowVoList", vo.getFormShowVoList());
        //字典码信息
        view.addObject("searchSelectList", vo.getSearchSelectList());
        view.addObject("showSelectList", vo.getShowSelectList());
        view.addObject("allSelect", StringUtils.join(vo.getAllSelectList(), ","));
        //类信息
        view.addObject("moduleName", "gen");
        view.addObject("functionName", "form");
        return view;
    }

    /**
     * 分页查询表格预览
     *
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/12 15:04
     */
    @RequestMapping(value = "/gen/form/pagePreview", method = RequestMethod.POST)
    public ReturnResult pagePreview() {
        return new ReturnResult(null, 0, false);
    }

    /**
     * 跳转表单预览界面
     *
     * @param formTableVo 传入参数对象
     * @return ModelAndView
     * @author rong yuan
     * @date 2019/4/12 16:15
     */
    @RequestMapping(value = "/gen/form/getFormPreviewEdit", method = RequestMethod.GET)
    public ModelAndView getFormPreviewEdit(FormTableVo formTableVo) {
        ModelAndView view = new ModelAndView("/gen/form/formPreviewEdit");
        FormTableVo vo = formTableService.selectForPreviewEdit(formTableVo);
        //表单字段信息
        view.addObject("formFieldVoList", vo.getFormFieldVoList());
        //字典码信息
        view.addObject("fieldSelectList", vo.getFieldSelectList());
        view.addObject("allSelect", StringUtils.join(vo.getAllSelectList(), ","));
        //类信息
        view.addObject("moduleName", "gen");
        view.addObject("entityLowerCase", "genForm");
        return view;
    }
}